package transacoes;

import iniciarJogo.ConstantesJogo;

import java.io.Serializable;
import java.util.Iterator;

import excecoes.ConstruirCasaException;
import excecoes.DinheiroInsuficienteException;
import excecoes.FaltamCasasException;
import excecoes.FaltamTerrenosException;
import excecoes.JogadorNaoEncontradoException;
import excecoes.LimiteDeCasasException;
import excecoes.LugarInvalidoException;

import model.Descricao;
import model.Empresa;
import model.Jogador;
import model.Lugar;
import model.Terreno;

public class Transacoes implements Serializable{

	private static final long serialVersionUID = -1108691812387464825L;
	
	public Transacoes(){	}
	
	public boolean hipotecarLugar(Jogador dono,Lugar lugar) throws LugarInvalidoException {
		Descricao descricao = lugar.getDescricao();
		if (descricao instanceof Terreno) {
		
		}
		else if (descricao instanceof Empresa) {
			
		}
		else {
			throw new LugarInvalidoException();
		}
		return false;
	}
	
	public boolean venderLugar(Jogador comprador, Jogador vendedor, Lugar lugar) throws DinheiroInsuficienteException{
		double dinheiroComprador = comprador.getDinheiro();
		if(lugar.getDescricao() instanceof Terreno){
			Terreno t = (Terreno)lugar.getDescricao();
			if(dinheiroComprador >= t.getValor()){
				comprador.setDinheiro(dinheiroComprador - t.getValor());
				t.setDono(comprador);
				vendedor.getListaPosses().remove(lugar);
				return true;
			}else{
				throw new DinheiroInsuficienteException();
			}
		}
		return false;
	}
	
	public boolean comprarLugarAoBanco(Jogador comprador, Lugar lugar) throws DinheiroInsuficienteException{
		Descricao descricao = lugar.getDescricao();
		double dinheiroJogador = comprador.getDinheiro();
		if(descricao instanceof Empresa){
			Empresa empresa = (Empresa)descricao;
			double valorEmpresa = empresa.getValor();
			if (dinheiroJogador >= valorEmpresa){
				comprador.setDinheiro(dinheiroJogador - valorEmpresa);
				comprador.addPosse(lugar);
			}else{
				throw new DinheiroInsuficienteException();
			}
			return true;
			
		}else if(descricao instanceof Terreno){
			Terreno terreno = (Terreno)descricao;
			double valorTerreno = terreno.getValor();
			if (dinheiroJogador >= valorTerreno){
				comprador.setDinheiro(dinheiroJogador - valorTerreno);
				comprador.addPosse(lugar);
			}else{
				throw new DinheiroInsuficienteException();
			}
			return true;
		}
		return false;
	}

	public boolean construirCasa(Jogador jogador, Lugar lugarEscolhido) throws LimiteDeCasasException, ConstruirCasaException, FaltamTerrenosException, DinheiroInsuficienteException{
		if(lugarEscolhido.getDescricao() instanceof Terreno){
			if(jogador.getDinheiro() >= ConstantesJogo.DINHEIRO_CONSTRUIR_CASA){
				Terreno terrenoEscolhido = (Terreno)lugarEscolhido.getDescricao();
			
				Iterator<Lugar> it = jogador.getPosses();
				Lugar lugar = null;
				Terreno menor = null;
				Terreno terreno = null;
				int quantidade = 0;
		
				while(it.hasNext()){
					lugar = it.next();
					if(lugar.getDescricao() instanceof Terreno && lugar.getCor() == lugarEscolhido.getCor()){
						quantidade++;
						terreno = (Terreno)lugar.getDescricao();
						if(menor == null) 
							menor = terreno;
						else if(terreno.getQuantidadeCasas()< menor.getQuantidadeCasas()) menor = terreno;
					}
				}
		
				if(menor != terrenoEscolhido){
					throw new ConstruirCasaException();
				}else if(menor.getQuantidadeCasas()==4){
					throw new LimiteDeCasasException();
				}else if(quantidade >= 3){
					double dinheiro = jogador.getDinheiro();
					jogador.setDinheiro(dinheiro - ConstantesJogo.DINHEIRO_CONSTRUIR_CASA);
					terrenoEscolhido.construirCasa();
					return true;
				}else
				throw new FaltamTerrenosException();
			}else{
				throw new DinheiroInsuficienteException();
			}
		}else{
			return false;
		}
	}
	
	public boolean construirHotel(Jogador jogador, Lugar lugarEscolhido) throws FaltamCasasException, DinheiroInsuficienteException{
		if(lugarEscolhido.getDescricao() instanceof Terreno){
			if(jogador.getDinheiro()>= ConstantesJogo.DINHEIRO_CONSTRUIR_HOTEL){
				Terreno terreno = (Terreno)lugarEscolhido.getDescricao();
				if(terreno.getQuantidadeCasas()==4){
					double dinheiro = jogador.getDinheiro();
					jogador.setDinheiro(dinheiro-ConstantesJogo.DINHEIRO_CONSTRUIR_HOTEL);
					terreno.construirHotel();
					return true;
				}else{
					throw new FaltamCasasException();
				}	
			}else{
				throw new DinheiroInsuficienteException();
			}
		}else
			return false;
	}
	
	// retorna o valor total dos bens do jogador.
	public double contabilizarBens(Jogador jogador) throws JogadorNaoEncontradoException{
		double total= jogador.getDinheiro();
			
		Iterator<Lugar> it = jogador.getPosses();
		while(it.hasNext()){
			Lugar lugar = it.next();
			if(lugar.getDescricao() instanceof Empresa){
				Empresa e = (Empresa)lugar.getDescricao();
				total += e.getValor();
			}else{
				if(lugar.getDescricao() instanceof Terreno){
					Terreno t = (Terreno)lugar.getDescricao();
					total += t.getValor();
				}
			}
		}	
		return total;
	}	
}
